package com.xinyu.utils;

import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Arrays;
import java.util.List;
import java.util.TimeZone;

import org.apache.commons.lang3.StringUtils;

public class DateTimeUtils {

    private static final DateTimeFormatter MYSQL_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    private static final List<DateTimeFormatter> LOCAL_DATE_TIME_FORMATTERS = Arrays.asList(
            MYSQL_FORMATTER,
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"),
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"),
            DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"),
            DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm")
    );

    /**
     * 将时间字符串转换为 MySQL 支持的格式（yyyy-MM-dd HH:mm:ss）。
     * 默认使用系统时区。
     */
    public static String convertToMySQLDateTime(String dateTime) {
        return convertToMySQLDateTime(dateTime, TimeZone.getDefault().getID());
    }

    /**
     * 将时间字符串转换为指定时区的 MySQL 支持的格式（yyyy-MM-dd HH:mm:ss）。
     * 兼容 ISO 8601（含 T/时区）和已是本地格式的字符串。
     */
    public static String convertToMySQLDateTime(String dateTime, String timeZoneId) {
        if (StringUtils.isBlank(dateTime)) {
            return dateTime;
        }

        ZoneId targetZone = TimeZone.getTimeZone(timeZoneId).toZoneId();

        if (dateTime.contains("T")) {
            return formatIsoInput(dateTime, targetZone);
        }

        LocalDateTime localDateTime = parseLocalDateTime(dateTime);
        return localDateTime.format(MYSQL_FORMATTER);
    }

    private static String formatIsoInput(String dateTime, ZoneId zoneId) {
        try {
            ZonedDateTime zonedDateTime = ZonedDateTime.parse(dateTime);
            return zonedDateTime.withZoneSameInstant(zoneId).format(MYSQL_FORMATTER);
        } catch (DateTimeParseException ex) {
            LocalDateTime localDateTime = LocalDateTime.parse(dateTime, DateTimeFormatter.ISO_LOCAL_DATE_TIME);
            return localDateTime.atZone(zoneId).format(MYSQL_FORMATTER);
        }
    }

    private static LocalDateTime parseLocalDateTime(String dateTime) {
        DateTimeParseException lastException = null;
        for (DateTimeFormatter formatter : LOCAL_DATE_TIME_FORMATTERS) {
            try {
                return LocalDateTime.parse(dateTime, formatter);
            } catch (DateTimeParseException ex) {
                lastException = ex;
            }
        }
        throw new IllegalArgumentException("Unsupported date time format: " + dateTime, lastException);
    }

    public static void main(String[] args) {
        // 示例：将 ISO 8601 时间转换为 MySQL 格式
        String isoDateTime = "2025-03-14T04:47:00.000Z";
        String mysqlDateTime = convertToMySQLDateTime(isoDateTime);
        System.out.println("转换后的时间（默认时区）: " + mysqlDateTime);

        // 示例：将本地时间格式转换为 MySQL 格式
        String localDateTime = "2025-11-12 21:01:22";
        System.out.println("转换后的时间（本地格式）: " + convertToMySQLDateTime(localDateTime));

        // 示例：将 ISO 8601 时间转换为指定时区的 MySQL 格式
        String mysqlDateTimeShanghai = convertToMySQLDateTime(isoDateTime, "Asia/Shanghai");
        System.out.println("转换后的时间（上海时区）: " + mysqlDateTimeShanghai);
    }
}
